package com.eascs.p2p.common.util;

import java.util.List;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import com.eascs.app.log.Logger;
import com.eascs.app.log.LoggerFactory;
import com.eascs.common.util.StringUtil;

@Component
public class WebServiceUtil {
	private final Logger logger = LoggerFactory.getLogger(WebServiceUtil.class);
	
	/**
	 * 
	 * @param remoteUrl			需要调用的WebService的URL
	 * @param remoteMethod		需要调用的WebService的方法
	 * @param requestContent	调用WebService时的请求内容
	 * @param rootElement		WebService响应结果的根元素
	 * @return
	 * 2016年6月20日
	 */
	public List<Element> call(String remoteUrl, String remoteMethod, String requestContent, String rootElement){
		Document doc = callAndGetDom(remoteUrl, remoteMethod, requestContent);
		Element root = doc.getRootElement().element(rootElement);
		
		@SuppressWarnings("unchecked")
		List<Element> list = root.elements(); 
		
		return CollectionUtils.isEmpty(list) ? null : list;
	}
	
	/**
	 * 
	 * @param remoteUrl			需要调用的WebService的URL
	 * @param remoteMethod		需要调用的WebService的方法
	 * @param requestContent	调用WebService时的请求内容
	 * @return
	 * 2016年6月20日
	 */
	public Document callAndGetDom(String remoteUrl, String remoteMethod, String requestContent){
			String response = call(remoteUrl, remoteMethod, requestContent);
			
			Document doc = null;
			if(StringUtil.isNotBlank(response) && response.contains("<")){
				try {
					doc = DocumentHelper.parseText(response);
				} catch (DocumentException e) {
					e.printStackTrace();
					logger.error("[WebServiceUtil]解析Dom出错");
				}
			}
			return doc;
	}
	
	/**
	 * 
	 * @param remoteUrl			需要调用的WebService的URL
	 * @param remoteMethod		需要调用的WebService的方法
	 * @param requestContent	调用WebService时的请求内容
	 * @return
	 * 2016年6月20日
	 */
	public String call(String remoteUrl, String remoteMethod, String requestContent){
		Service service =  new  Service(); 
		String response = "";
		
		try {
			Call call = (Call)service.createCall();
			call.setTargetEndpointAddress(remoteUrl);   
			call.setOperationName(remoteMethod);
			
			response = (String) call.invoke(new Object[] {requestContent});
			response = new String(response.getBytes("iso8859-1"), "utf-8");
			logger.info("resp:[{}],[{}],[{}]", response);
		} catch (Exception e) {
			e.printStackTrace();
			Object[] requestParams = {remoteUrl, remoteMethod, requestContent};
			logger.error("[WebServiceUtil]调用远程URL[{}]出错， 远程方法名[{}], 请求内容[{}]", requestParams);
		}
		return response;
	}
}
